package tp.disenio.client;

import java.util.ArrayList;

import tp.disenio.client.CompetenciaDTO;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.ScrollPanel;

//CU-003 Listar Competencias Deportivas -  Usuario Autenticado

public class ListarCompetenciasDeportivasUA extends Composite{
	private Button buttonHome;
	private Button btnCrearCompetencia;
	private TextBox textBox;
	private FlexTable flexTable;
	private ScrollPanel scrollPanelCompetencias;
	private ListBox listbxDeporte;
	private ListBox listbxxModalidad;
	private ListBox listbxEstadodecompetencia;
	private Button btnBuscarCompetencia;
	private TextBox txtBxCompetencia;
	private Label lblUsuario;
	private Label lblSalir;
	final RootPanel rootPanel;
	private ArrayList<String> listadoBotonDeLupa = new ArrayList<String>();
	private ArrayList<CompetenciaDTO> listadoCompetencias = new ArrayList<CompetenciaDTO>();
	
	public ListarCompetenciasDeportivasUA(String user){
			
		rootPanel = RootPanel.get("nameFieldContainer");
		
		AbsolutePanel absolutePanel = new AbsolutePanel();
		initWidget(absolutePanel);
		absolutePanel.setSize("1024px", "576px");
		
		// WIDGETS
		
		buttonHome = new Button("Home");
		absolutePanel.add(buttonHome, 100, 105);
		buttonHome.setSize("50px", "30px");
		
		btnCrearCompetencia = new Button("Crear Competencia");
		absolutePanel.add(btnCrearCompetencia, 452, 125);
		btnCrearCompetencia.setSize("150", "20");
		
		btnBuscarCompetencia = new Button("Buscar");
		absolutePanel.add(btnBuscarCompetencia, 254, 255);
		btnBuscarCompetencia.setSize("70", "30");
		
		listbxDeporte = new ListBox();
		agregarCamposListBox(listbxDeporte);
		absolutePanel.add(listbxDeporte, 340, 225);
		listbxDeporte.setSize("169px", "22px");
		
		listbxxModalidad = new ListBox();
		agregarCamposListBox(listbxxModalidad);
		absolutePanel.add(listbxxModalidad, 602, 185);
		listbxxModalidad.setSize("169px", "22px");
		
		listbxEstadodecompetencia = new ListBox();
		agregarCamposListBox(listbxEstadodecompetencia);
		absolutePanel.add(listbxEstadodecompetencia, 602, 225);
		listbxEstadodecompetencia.setSize("169px", "22px");
		
		txtBxCompetencia = new TextBox();
		absolutePanel.add(txtBxCompetencia, 340, 190);
		txtBxCompetencia.setSize("159px", "10px");
		
		scrollPanelCompetencias = new ScrollPanel();
		absolutePanel.add(scrollPanelCompetencias, 265, 320);
		scrollPanelCompetencias.setSize("520px", "180px");
		
		flexTable = new FlexTable();
		scrollPanelCompetencias.setWidget(flexTable);
		flexTable.setSize("100%", "100%");
		
	
						
		// LABELS 
		
		Label labelNombre = new Label("Nombre");
		labelNombre.setStyleName("camposTabla");
		labelNombre.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		absolutePanel.add(labelNombre,300,290);
		
		Label labelDeporte = new Label("Deporte");
		labelDeporte.setStyleName("camposTabla");
		labelDeporte.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		absolutePanel.add(labelDeporte,420,290);
		
		Label labelModalidad = new Label("Modalidad");
		labelModalidad.setStyleName("camposTabla");
		labelModalidad.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		absolutePanel.add(labelModalidad,520,290);
		
		Label labelEstadodecompetenciadecompetencia = new Label("Estado");
		labelEstadodecompetenciadecompetencia.setStyleName("camposTabla");
		labelEstadodecompetenciadecompetencia.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		absolutePanel.add(labelEstadodecompetenciadecompetencia,645,290);
		
		Label labelVerCompetenciaSeleccionada = new Label("Ver");
		labelVerCompetenciaSeleccionada.setStyleName("camposTabla");
		labelVerCompetenciaSeleccionada.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
		absolutePanel.add(labelVerCompetenciaSeleccionada,723,290);
		
		Label lblBusqueda = new Label("Busqueda");
		lblBusqueda.setStyleName("subTitulo");
		absolutePanel.add(lblBusqueda, 336, 155);
		
		Label lblCompetencia = new Label("Competencia");
		lblCompetencia.setStyleName("label");
		absolutePanel.add(lblCompetencia, 250, 190);
		
		Label lblDeporte = new Label("Deporte");
		lblDeporte.setStyleName("label");
		absolutePanel.add(lblDeporte, 250, 225);
		
		Label lblEstadodecompetenciadecompetencia = new Label("Estado");
		lblEstadodecompetenciadecompetencia.setStyleName("label");
		absolutePanel.add(lblEstadodecompetenciadecompetencia, 520, 225);
		
		Label lblModalidad = new Label("Modalidad");
		lblModalidad.setStyleName("label");
		absolutePanel.add(lblModalidad, 520, 190);
					
		lblUsuario = new Label("");
		lblUsuario.setText(user);
		lblUsuario.setStyleName("usuarioLabel");
		absolutePanel.add(lblUsuario, 820, 100);
		
		lblSalir = new Label("Salir");
		lblSalir.setStyleName("usuarioLabel");
		absolutePanel.add(lblSalir, 780, 100);
				
		
		//Limpiando listboxs
		getListBxDeporte().clear();getListBxModalidad().clear();getListBxEstadodecompetenciadecompetencia().clear();
		
		// Inicializando listboxs
		agregarCamposListBox("listbxDeporte");
		agregarCamposListBox("listbxModalidad");
		agregarCamposListBox("listbxEstadodecompetencia");
		getTxtBxCompetencia().setText("");
		
		// HANDLERS
		
		
		
		getLblUsuario().addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
			
				Window.alert("Modficar Datos Usuario ");
				
			}
		});
		
		
		getLblSalir().addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				
//				setVisibilidad(false);
				rootPanel.remove(rootPanel.getWidget(1));
				rootPanel.add(new Ingreso(),(Window.getClientWidth()/3),150);
				Window.alert("Usted se ha deslogeado");
				
			}
		});
		
		getButtonHome().addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
			
//				setVisibilidad(false);
				rootPanel.remove(rootPanel.getWidget(1));
				rootPanel.add(new HomeUA(getLblUsuario().getText()),100,50);
			   
			}
		});
		
		getBtnCrearCompetencia().addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
//				setVisibilidad(false);
				rootPanel.remove(rootPanel.getWidget(1));
				rootPanel.add(new AltaCompetenciaDeportiva(getLblUsuario().getText()),100,50);
			}
		});
		
		
		getBtnBuscar().addClickHandler(new ClickHandler() {
			
			
			
			final ListarCompetenciasServiceAsync listarCompetenciasUA = GWT.create(ListarCompetenciasService.class);
			
			@Override
			public void onClick(ClickEvent event) {
							
				AsyncCallback<ArrayList<CompetenciaDTO>> callback = new AsyncCallback<ArrayList<CompetenciaDTO>>(){
					
					@Override
					public void onSuccess(ArrayList<CompetenciaDTO> result) {
									
						flexTable.removeAllRows();
						if(!getListadoCompetencias().isEmpty()){
							getListadoCompetencias().clear();
						 }
						 getListadoBotonDeLupa().clear();
						 
						setListadoCompetencias(result);
						CargarCompetencias(getFlexTable());
						 
					}
					
					@Override
					public void onFailure(Throwable caught) {
									
							Window.alert("Ha ocurrido un error");
						}
						
				};
				
			
				try{
				
					validarCampos();
					listarCompetenciasUA.listarCompetencias(getLblUsuario().getText(), getTxtBxCompetencia().getText(), getListBxDeporte().getItemText(getListBxDeporte().getSelectedIndex()), getListBxModalidad().getItemText(getListBxModalidad().getSelectedIndex()), getListBxEstadodecompetenciadecompetencia().getItemText(getListBxEstadodecompetenciadecompetencia().getSelectedIndex()), callback);
					
				}		
				catch (Exception mensaje) {
				
					Window.alert(mensaje.getMessage());
				}
				
			}
			
			
		});
		
		
		// TAB INDEX
		
		getButtonHome().setTabIndex(1);
		getBtnCrearCompetencia().setTabIndex(2);
		getTxtBxCompetencia().setTabIndex(3);
		getListBxModalidad().setTabIndex(4);
		getListBxDeporte().setTabIndex(5);		
		getListBxEstadodecompetenciadecompetencia().setTabIndex(6);
		getBtnBuscar().setTabIndex(7);
		getScrollPanelCompetencias().getElement().setTabIndex(8);
		
		
	}
	
	public boolean validarCampos() throws IllegalArgumentException{
		
		if(getTxtBxCompetencia().getText().equals("") 
				&& getListBxDeporte().getItemText(getListBxDeporte().getSelectedIndex()).equals("")
				&& getListBxEstadodecompetenciadecompetencia().getItemText(getListBxEstadodecompetenciadecompetencia().getSelectedIndex()).equals("")  
				&& getListBxModalidad().getItemText(getListBxModalidad().getSelectedIndex()).equals("")){
			
			throw new IllegalArgumentException("Debe ingresar al menos un campo");
			
		}	
		
		
		return true;
				
	}
	
	
	public Button getButtonHome() {
		return buttonHome;
	}
	public Button getBtnCrearCompetencia() {
		return btnCrearCompetencia;
	}
	public TextBox getTextBox() {
		return textBox;
	}
	public ListBox getListBxDeporte() {
		return listbxDeporte;
	}
	public ListBox getListBxModalidad() {
		return listbxxModalidad;
	}
	public ListBox getListBxEstadodecompetenciadecompetencia() {
		return listbxEstadodecompetencia;
	}
	public Button getBtnBuscar() {
		return btnBuscarCompetencia;
	}
		
	public Label getLblUsuario() {
		return lblUsuario;
	}
	public void setLblUsuario(Label lblUsuario) {
		this.lblUsuario = lblUsuario;
	}
	public Label getLblSalir() {
		return lblSalir;
	}
	public void setLblSalir(Label lblSalir) {
		this.lblSalir = lblSalir;
	}
	
	public void agregarCamposListBox(ListBox listBox){
		// TODO Implementar cargar de base de datos los campos del listbox correspondiente
		
		
	}
	
	public TextBox getTxtBxCompetencia() {
		return txtBxCompetencia;
	}
	
	public void CargarCompetencias(FlexTable flexTable){
		
			
		flexTable.setStyleName("FlexTable");
		
			for(int i=0; i<getListadoCompetencias().size(); i++){
				
				flexTable.setText(i, 0,getListadoCompetencias().get(i).getNombre());
				flexTable.setText(i, 1,getListadoCompetencias().get(i).getDeporte());
				flexTable.setText(i, 2,getListadoCompetencias().get(i).getModalidad());
				flexTable.setText(i, 3,getListadoCompetencias().get(i).getEstadodecompetencia());
				
				flexTable.getRowFormatter().addStyleName(i, "FlexTable");				
				flexTable.getColumnFormatter().setWidth(0, "30px");
				flexTable.getColumnFormatter().setWidth(1, "60px");
				flexTable.getColumnFormatter().setWidth(2, "40px");
				flexTable.getColumnFormatter().setWidth(3, "40px");
				flexTable.getColumnFormatter().setWidth(4, "30px");

				
				Image imagenVerCompetenciaBtn = new Image("images/lupa.jpg");
				
				imagenVerCompetenciaBtn.setSize("35px", "30px");
				imagenVerCompetenciaBtn.setTitle("Ver competencia");
				
				flexTable.setWidget(i, 4, imagenVerCompetenciaBtn);

		
								
				final String symbol = i+"1";
				listadoBotonDeLupa.add(symbol);
				
		
				imagenVerCompetenciaBtn.addClickHandler(new ClickHandler() {
					
					@Override
					public void onClick(ClickEvent event) {
						// TODO Auto-generated method stub
						
//						setVisibilidad(false);
						rootPanel.remove(rootPanel.getWidget(1));
						    
						int fila = getListadoBotonDeLupa().indexOf(symbol);
						getListadoBotonDeLupa().remove(symbol);
						
						getRootPanel().add(new VerCompetenciaUA(getLblUsuario().getText(),getListadoCompetencias().get(fila)),100,50);
						
					}
				});
			
				
			}
		
			
									
		
		}

	public FlexTable getFlexTable() {
		return flexTable;
	}
	
	public void setVisibilidad(boolean estado){
		this.setVisible(estado);
	}
	
public void cargarCamposListbox(ListBox listbox,ArrayList<String> campos){
		
		for(int i=0;i<campos.size();i++){
			
			listbox.addItem(campos.get(i));
			
		}
		
	}
	
	public void agregarCamposListBox(String listboxNombre){
		
		final CamposListboxServiceAsync cargarCamposListbox = GWT.create(CamposListboxService.class);
		final String lbxNombre = listboxNombre;
	
		AsyncCallback<ArrayList<String>> callback = new AsyncCallback<ArrayList<String>>(){
			
			@Override
			public void onSuccess(ArrayList<String> result) {
				// TODO Auto-generated method stub
				
				  
				   cargarCamposListbox(getListbx(lbxNombre),result);
				 
				}
			
			@Override
			public void onFailure(Throwable caught) {
				// TODO Auto-generated method stub
				
					Window.alert("Ha ocurrido un error");
				}
				
		};
		
	   cargarCamposListbox.camposListbox(listboxNombre, callback);
		
	}
	
    private ListBox getListbx(String listboxNombre){
		
		ListBox retorno;
			
		if(listboxNombre.equals("listbxDeporte")){
			
			retorno = getListBxDeporte();
		}
		
		else if(listboxNombre.equals("listbxModalidad")){
			
			retorno = getListBxModalidad();
		}
				
		else if(listboxNombre.equals("listbxEstadodecompetencia")){
			
			retorno = getListBxEstadodecompetenciadecompetencia();
		}
	
		else{
			retorno = new ListBox();
		}
		
		return retorno;
	}
    

	/**
	 * @return the listadoCompetencias
	 */
	public ArrayList<CompetenciaDTO> getListadoCompetencias() {
		return listadoCompetencias;
	}
	/**
	 * @param listadoCompetencias the listadoCompetencias to set
	 */
	public void setListadoCompetencias(ArrayList<CompetenciaDTO> listadoCompetencias) {
		this.listadoCompetencias = listadoCompetencias;
	}
	
	
	/**
	 * @return the rootPanel
	 */
	public RootPanel getRootPanel() {
		return rootPanel;
	}
	

	/**
	 * @return the listadoBotoneLupa
	 */
	public ArrayList<String> getListadoBotonDeLupa() {
		return listadoBotonDeLupa;
	}
	
	public ScrollPanel getScrollPanelCompetencias() {
		return scrollPanelCompetencias;
	}

}
